import re
from urllib.parse import urljoin

from bs4 import BeautifulSoup

from selenium import webdriver
from selenium.webdriver.edge.service import Service
from selenium.webdriver.edge.options import Options as EdgeOptions  # 修改1：导入Edge专用Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time


def manga_search_data(html_text):
    """
    从HTML文本中提取漫画信息并生成结构化数据
    参数:
        html_text: 包含data-original、href和标签文本的HTML
    返回:
        {"data": [{"name": "", "url": "", "cover": ""}, ...]}
    """
    # 更新正则表达式：匹配data-original、href和标签内的文本
    pattern = r'data-original="([^"]+)".*?href="([^"]+)"[^>]*>([^<]+)</a>'
    matches = re.finditer(pattern, html_text, re.DOTALL)
    
    result = {"data": []}
    base_url = "https://www.haoduoman.com"  # 修改基础URL
    
    for match in matches:
        cover = match.group(1).replace("&quot;", "").strip()
        href = match.group(2).strip()
        name = match.group(3).strip()
        
        # 构造完整URL并确保协议正常
        full_url = urljoin(base_url, href)
        item = {"name": name, "url": full_url, "cover": cover}
        result["data"].append(item)
    
    return result


def manga_chapter_data(html_text, base_url="https://www.haoduoman.com"):
    """
    从HTML文本中提取漫画章节信息
    
    参数:
        html_text: 包含章节列表的HTML文本
        base_url: 用于转换相对URL的基础域名
    
    返回:
        {"data": [{"name": "章节名", "url": "完整章节URL"}, ...]}
    """
    soup = BeautifulSoup(html_text, 'html.parser')
    
    # 根据图片中的class定位<ul class="comic-chapters">
    chapter_ul = soup.find('ul', class_='comic-chapters')

    if not chapter_ul:
        return {"data": []}
    
    chapters = []
    
    # 精确处理LI内的结构 (包含空<i>标签)
    for li in chapter_ul.find_all('li'):
        # 跳过不含有效链接的LI (如空列表项)
        if not li.find('a', href=True):
            continue
            
        # 获取章节链接和文本
        link = li.find('a', href=True)
        chapter_name = link.get_text(strip=True)  # "第1话 唐三穿越(上)"
        relative_url = link['href']  # "/manhua/55429/1.html"
        full_url = urljoin(base_url, relative_url)
        
        chapters.append({
            "name": chapter_name,
            "url": full_url
        })
    
    return {"data": chapters}




def manga_images_data(url):
    """
    获取动态网页中漫画图片的原始数据URL
    
    参数:
        url (str): 目标网页URL
        
    返回:
        list: 包含所有图片原始URL的数组
    """
    # 配置Edge无头模式（关键修改）
    edge_options = EdgeOptions()  # 修改2：使用EdgeOptions替代ChromeOptions
    edge_options.add_argument("--headless=new")  # 修改3：使用新版无头模式
    edge_options.add_argument("--disable-gpu")
    edge_options.add_argument("--no-sandbox")
    edge_options.add_argument("--disable-dev-shm-usage")
    edge_options.add_argument("--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.203")
    edge_options.add_argument("--disable-blink-features=AutomationControlled")  # 反自动化检测[4](@ref)
    edge_options.add_argument("--log-level=3")  # 仅显示FATAL级错误
    edge_options.add_experimental_option("excludeSwitches", ["enable-logging"])  # 隐藏DevTools日志
    edge_options.page_load_strategy = "eager"  # 加速页面加载[4](@ref)

    # 初始化浏览器
    # 指定驱动路径（替换为实际路径）
    edge_driver_path = r'C:\Users\admin\Desktop\newproject\edgedriver_win32\msedgedriver.exe'
    service = Service(executable_path=edge_driver_path)
    driver = webdriver.Edge(service=service, options=edge_options)  # 修改4：使用Edge驱动
    img_urls = []
    
    try:
        # 访问目标网页
        print("正在访问网页...")
        driver.set_page_load_timeout(60)  # 延长超时时间[4](@ref)
        driver.get(url)
        
        # 显式等待目标容器加载完成
        WebDriverWait(driver, 15).until(
            EC.presence_of_element_located((By.ID, "content-container"))
        )
        print("容器加载完成")
        
        # 显式等待漫画图片元素出现（优化选择器）
        WebDriverWait(driver, 25).until(
            EC.presence_of_element_located((By.CSS_SELECTOR, ".chapter-image, [class*='image']"))
        )
        print("检测到图片元素")
        
        # 分段滚动加载（更接近真实用户行为）[4](@ref)
        print("模拟滚动加载...")
        scroll_height = driver.execute_script("return document.body.scrollHeight")
        for y in range(0, scroll_height, 500):
            driver.execute_script(f"window.scrollTo(0, {y})")
            time.sleep(0.3)
        
        # 等待图片动态加载（兼容多种懒加载属性）
        print("等待图片加载...")
        WebDriverWait(driver, 35).until(
            EC.presence_of_all_elements_located(
                (By.CSS_SELECTOR, ".chapter-image[data-original], [data-src], img.lazyload")
            )
        )
        
        # 定位所有图片容器元素
        image_containers = driver.find_elements(By.CSS_SELECTOR, ".chapter-image")
        print(f"找到 {len(image_containers)} 个图片容器")
        
        # 提取data-original属性值（增加回退逻辑）
        img_urls = []
        for container in image_containers:
            img_url = (
                container.get_attribute("data-original") 
                or container.get_attribute("data-src")
                or container.get_attribute("src")
            )
            if img_url and "placeholder" not in img_url:
                img_urls.append(img_url)
        
        # 打印部分结果用于调试
        # for idx, url in enumerate(img_urls[:3]):
        #     print(f"图片 {idx+1}: {url}")
        
    except Exception as e:
        print(f"获取内容时出错: {str(e)}")
    finally:
        # 关闭浏览器
        driver.quit()
    
    return img_urls